Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / app / src / google / kotlin / org / meshtastic / app / map / MapViewModel.kt

Displaying Raw • Download

app/src/google/kotlin/org/meshtastic/app/map/MapViewModel.kt 9acdf5309f8f0ab96b30d6505bdac5e93a3bb72c (9acdf530) Text, 29.63 KB

T8b949e/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.app.map

Tff7b72import T7ee787android.app.Application
Tff7b72import T7ee787android.net.Uri
Tff7b72import T7ee787androidx.core.net.toFile
Tff7b72import T7ee787androidx.lifecycle.SavedStateHandle
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787com.google.android.gms.maps.model.CameraPosition
Tff7b72import T7ee787com.google.android.gms.maps.model.LatLng
Tff7b72import T7ee787com.google.android.gms.maps.model.TileProvider
Tff7b72import T7ee787com.google.android.gms.maps.model.UrlTileProvider
Tff7b72import T7ee787com.google.maps.android.compose.CameraPositionState
Tff7b72import T7ee787com.google.maps.android.compose.MapType
Tff7b72import T7ee787io.ktor.client.HttpClient
Tff7b72import T7ee787io.ktor.client.request.get
Tff7b72import T7ee787io.ktor.client.statement.bodyAsChannel
Tff7b72import T7ee787io.ktor.http.isSuccess
Tff7b72import T7ee787io.ktor.utils.io.jvm.javaio.toInputStream
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableSharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asSharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.first
Tff7b72import T7ee787kotlinx.coroutines.flow.mapNotNull
Tff7b72import T7ee787kotlinx.coroutines.flow.update
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.withContext
Tff7b72import T7ee787kotlinx.serialization.Serializable
Tff7b72import T7ee787org.koin.core.annotation.KoinViewModel
Tff7b72import T7ee787org.meshtastic.app.map.model.CustomTileProviderConfig
Tff7b72import T7ee787org.meshtastic.app.map.prefs.map.GoogleMapsPrefs
Tff7b72import T7ee787org.meshtastic.app.map.repository.CustomTileProviderRepository
Tff7b72import T7ee787org.meshtastic.core.di.CoroutineDispatchers
Tff7b72import T7ee787org.meshtastic.core.model.RadioController
Tff7b72import T7ee787org.meshtastic.core.repository.MapPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.repository.UiPrefs
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.feature.map.BaseMapViewModel
Tff7b72import T7ee787org.meshtastic.proto.Config
Tff7b72import T7ee787java.io.File
Tff7b72import T7ee787java.io.FileOutputStream
Tff7b72import T7ee787java.io.IOException
Tff7b72import T7ee787java.io.InputStream
Tff7b72import T7ee787java.net.MalformedURLException
Tff7b72import T7ee787java.net.URL
Tff7b72import T7ee787kotlin.uuid.Uuid

Tff7b72private Tff7b72const Tff7b72val Te6edf3TILE_SIZE Tff7b72= T79c0ff2T79c0ff5T79c0ff6

Tf0883e@Serializable
Tff7b72data Tff7b72class T56d364MapCameraPositionTb4b4b4(
Tff7b72val Te6edf3targetLatTb4b4b4: Tffa657DoubleTb4b4b4,
Tff7b72val Te6edf3targetLngTb4b4b4: Tffa657DoubleTb4b4b4,
Tff7b72val Te6edf3zoomTb4b4b4: Tffa657FloatTb4b4b4,
Tff7b72val Te6edf3tiltTb4b4b4: Tffa657FloatTb4b4b4,
Tff7b72val Te6edf3bearingTb4b4b4: Tffa657FloatTb4b4b4,
Tb4b4b4)

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@KoinViewModel
Tff7b72class T56d364MapViewModelTb4b4b4(
Tff7b72private Tff7b72val Te6edf3applicationTb4b4b4: Te6edf3ApplicationTb4b4b4,
Tff7b72private Tff7b72val Te6edf3dispatchersTb4b4b4: Te6edf3CoroutineDispatchersTb4b4b4,
Tff7b72private Tff7b72val Te6edf3httpClientTb4b4b4: Te6edf3HttpClientTb4b4b4,
Te6edf3mapPrefsTb4b4b4: Te6edf3MapPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3googleMapsPrefsTb4b4b4: Te6edf3GoogleMapsPrefsTb4b4b4,
Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Te6edf3radioControllerTb4b4b4: Te6edf3RadioControllerTb4b4b4,
Tff7b72private Tff7b72val Te6edf3customTileProviderRepositoryTb4b4b4: Te6edf3CustomTileProviderRepositoryTb4b4b4,
Te6edf3uiPrefsTb4b4b4: Te6edf3UiPrefsTb4b4b4,
Te6edf3savedStateHandleTb4b4b4: Te6edf3SavedStateHandleTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3BaseMapViewModelTb4b4b4(Te6edf3mapPrefsTb4b4b4, Te6edf3nodeRepositoryTb4b4b4, Te6edf3packetRepositoryTb4b4b4, Te6edf3radioControllerTb4b4b4) Tb4b4b4{

Tff7b72private Tff7b72val Te6edf3_selectedWaypointId Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3savedStateHandleTb4b4b4.Te6edf3getTff7b72<Tffa657IntTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffwaypointIdTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3selectedWaypointIdTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657Int?Tff7b72> Tff7b72= Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffsetWaypointIdTb4b4b4(Te6edf3idTb4b4b4: Tffa657Int?Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3id
Tff7b72if Tb4b4b4(Te6edf3id Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3wpMap Tff7b72= Te6edf3waypointsTb4b4b4.Te6edf3first Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3idTb4b4b4) Tb4b4b4}
Te6edf3wpMapTff7b72[Te6edf3idTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3waypoint Tff7b72= Te6edf3packetTb4b4b4.Te6edf3waypointTff7b72!!
Tff7b72val Te6edf3latLng Tff7b72= Te6edf3LatLngTb4b4b4(Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3latitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ T79c0ff1Te6edf3e7Tb4b4b4, Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3longitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ T79c0ff1Te6edf3e7Tb4b4b4)
Te6edf3cameraPositionStateTb4b4b4.Te6edf3position Tff7b72= Te6edf3CameraPositionTb4b4b4.Te6edf3fromLatLngZoomTb4b4b4(Te6edf3latLngTb4b4b4, T79c0ff1T79c0ff5fTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72val Te6edf3targetLatLng Tff7b72=
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3cameraTargetLatTb4b4b4.Te6edf3value
Tb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657it Tff7b72!Tff7b72= T79c0ff0.0 Tb4b4b4}
Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3lat Tff7b72-Tff7b72> Te6edf3googleMapsPrefsTb4b4b4.Te6edf3cameraTargetLngTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657it Tff7b72!Tff7b72= T79c0ff0.0 Tb4b4b4}Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3lng Tff7b72-Tff7b72> Te6edf3LatLngTb4b4b4(Te6edf3latTb4b4b4, Te6edf3lngTb4b4b4) Tb4b4b4} Tb4b4b4}
Tff7b72?: Te6edf3ourNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3positionTff7b72?.Te6edf3toLatLngTb4b4b4(Tb4b4b4)
Tff7b72?: Te6edf3LatLngTb4b4b4(T79c0ff0.0Tb4b4b4, T79c0ff0.0Tb4b4b4)

Tff7b72val Te6edf3cameraPositionState Tff7b72=
Te6edf3CameraPositionStateTb4b4b4(
Te6edf3position Tff7b72=
Te6edf3CameraPositionTb4b4b4(
Te6edf3targetLatLngTb4b4b4,
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3cameraZoomTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3cameraTiltTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3cameraBearingTb4b4b4.Te6edf3valueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3themeTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3uiPrefsTb4b4b4.Te6edf3theme

Tff7b72private Tff7b72val Te6edf3_errorFlow Tff7b72= Te6edf3MutableSharedFlowTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3errorFlowTb4b4b4: Te6edf3SharedFlowTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3_errorFlowTb4b4b4.Te6edf3asSharedFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3customTileProviderConfigsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tff7b72> Tff7b72=
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProvidersTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_selectedCustomTileProviderUrl Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3selectedCustomTileProviderUrlTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_selectedGoogleMapType Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4)
Tff7b72val Te6edf3selectedGoogleMapTypeTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTypeTff7b72> Tff7b72= Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3displayUnits Tff7b72=
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3deviceProfileFlow
Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3configTff7b72?.Te6edf3displayTff7b72?.Te6edf3units Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DisplayConfigTb4b4b4.Te6edf3DisplayUnitsTb4b4b4.Te6edf3METRICTb4b4b4)

Tff7b72fun Td2a8ffaddCustomTileProviderTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4, Te6edf3localUriTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3urlTemplateTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3localUri Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3localUri Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3urlTemplateTb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name, URL template, or local URI for custom tile provider.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffCustom tile provider with name 'Tffd700$Te6edf3nameTa5d6ff' already exists.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Tff7b72var Te6edf3finalLocalUri Tff7b72= Te6edf3localUri
Tff7b72if Tb4b4b4(Te6edf3localUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3localUriTb4b4b4)
Tff7b72val Te6edf3extension Tff7b72= Ta5d6ff"Ta5d6ffmbtilesTa5d6ff"
Tff7b72val Te6edf3finalFileName Tff7b72= Ta5d6ff"Ta5d6ffmbtiles_Tffd700${Te6edf3UuidTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff.Tffd700$Te6edf3extensionTa5d6ff"
Tff7b72val Te6edf3copiedUri Tff7b72= Te6edf3copyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3finalFileNameTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3copiedUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3finalLocalUri Tff7b72= Te6edf3copiedUriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffFailed to copy MBTiles file to internal storage.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError processing local URITa5d6ff" Tb4b4b4}
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffError processing local URI for MBTiles.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3newConfig Tff7b72= Te6edf3CustomTileProviderConfigTb4b4b4(Te6edf3name Tff7b72= Te6edf3nameTb4b4b4, Te6edf3urlTemplate Tff7b72= Te6edf3urlTemplateTb4b4b4, Te6edf3localUri Tff7b72= Te6edf3finalLocalUriTb4b4b4)
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3addCustomTileProviderTb4b4b4(Te6edf3newConfigTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffupdateCustomTileProviderTb4b4b4(Te6edf3configToUpdateTb4b4b4: Te6edf3CustomTileProviderConfigTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3configToUpdateTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplateTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3configToUpdateTb4b4b4.Te6edf3localUri Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3localUri Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplateTb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name, URL template, or local URI for updating custom tile provider.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72val Te6edf3existingConfigs Tff7b72= Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3value
Tff7b72if Tb4b4b4(
Te6edf3existingConfigsTb4b4b4.Te6edf3any Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3id Tff7b72!Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3id Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffAnother custom tile provider with name 'Tffd700${Te6edf3configToUpdateTb4b4b4.Te6edf3nameTffd700}Ta5d6ff' already exists.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3updateCustomTileProviderTb4b4b4(Te6edf3configToUpdateTb4b4b4)

Tff7b72val Te6edf3originalConfig Tff7b72= Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProviderByIdTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3idTb4b4b4)
Tff7b72if Tb4b4b4(
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72&
Te6edf3originalConfigTff7b72?.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value
Tb4b4b4) Tb4b4b4{
T8b949e// No change needed if URL didn't change, or handle if it did
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3originalConfig Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3originalConfigTb4b4b4.Te6edf3urlTemplateTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3currentlySelectedConfig Tff7b72=
Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3currentlySelectedConfigTff7b72?.Te6edf3id Tff7b72=Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplate
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffremoveCustomTileProviderTb4b4b4(Te6edf3configIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3configToRemove Tff7b72= Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProviderByIdTb4b4b4(Te6edf3configIdTb4b4b4)
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3deleteCustomTileProviderTb4b4b4(Te6edf3configIdTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3configToRemove Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3configToRemoveTb4b4b4.Te6edf3urlTemplate Tff7b72|Tff7b72|
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3configToRemoveTb4b4b4.Te6edf3localUri
Tb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
T8b949e// Also clear from prefs
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3configToRemoveTb4b4b4.Te6edf3localUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3configToRemoveTb4b4b4.Te6edf3localUriTb4b4b4)
Te6edf3deleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffselectCustomTileProviderTb4b4b4(Te6edf3configTb4b4b4: Te6edf3CustomTileProviderConfig?Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3config Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3configTb4b4b4.Te6edf3isLocal Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3configTb4b4b4.Te6edf3urlTemplateTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3wTb4b4b4(Ta5d6ff"Ta5d6ffAttempted to select invalid URL template: Tffd700${Te6edf3configTb4b4b4.Te6edf3urlTemplateTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72return
Tb4b4b4}
T8b949e// Use localUri if present, otherwise urlTemplate
Tff7b72val Te6edf3selectedUrl Tff7b72= Te6edf3configTb4b4b4.Te6edf3localUri Tff7b72?: Te6edf3configTb4b4b4.Te6edf3urlTemplate
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3selectedUrl
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NONE
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Te6edf3selectedUrlTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4.Te6edf3nameTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffsetSelectedGoogleMapTypeTb4b4b4(Te6edf3mapTypeTb4b4b4: Te6edf3MapTypeTb4b4b4) Tb4b4b4{
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3mapType
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null T8b949e// Clear custom selection
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3mapTypeTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72var Te6edf3currentTileProviderTb4b4b4: Te6edf3TileProvider? Tff7b72= Tff7b72null

Tff7b72fun Td2a8ffgetTileProviderTb4b4b4(Te6edf3configTb4b4b4: Te6edf3CustomTileProviderConfig?Tb4b4b4)Tb4b4b4: Te6edf3TileProvider? Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3config Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tb4b4b4(Te6edf3currentTileProvider Tff7b72as? Te6edf3MBTilesProviderTb4b4b4)Tff7b72?.Te6edf3closeTb4b4b4(Tb4b4b4)
Te6edf3currentTileProvider Tff7b72= Tff7b72null
Tff7b72return Tff7b72null
Tb4b4b4}

Tff7b72val Te6edf3selectedUrl Tff7b72= Te6edf3configTb4b4b4.Te6edf3localUri Tff7b72?: Te6edf3configTb4b4b4.Te6edf3urlTemplate
Tff7b72if Tb4b4b4(Te6edf3currentTileProvider Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3selectedUrlTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3currentTileProvider
Tb4b4b4}

T8b949e// Close previous if it was a local provider
Tb4b4b4(Te6edf3currentTileProvider Tff7b72as? Te6edf3MBTilesProviderTb4b4b4)Tff7b72?.Te6edf3closeTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3newProvider Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3isLocalTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3configTb4b4b4.Te6edf3localUriTb4b4b4)
Tff7b72val Te6edf3file Tff7b72=
Tff7b72try Tb4b4b4{
Te6edf3uriTb4b4b4.Te6edf3toFileTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3FileTb4b4b4(Te6edf3uriTb4b4b4.Te6edf3path Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MBTilesProviderTb4b4b4(Te6edf3fileTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffLocal MBTiles file does not exist: Tffd700${Te6edf3configTb4b4b4.Te6edf3localUriTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72null
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3urlString Tff7b72= Te6edf3configTb4b4b4.Te6edf3urlTemplate
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3urlStringTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)
Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffTile URL does not contain valid {x}, {y}, and {z} placeholders: Tffd700$Te6edf3urlStringTa5d6ff"Tb4b4b4)
Tff7b72null
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72object Tb4b4b4: T56d364UrlTileProviderTb4b4b4(Te6edf3TILE_SIZETb4b4b4, Te6edf3TILE_SIZETb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetTileUrlTb4b4b4(Te6edf3xTb4b4b4: Tffa657IntTb4b4b4, Te6edf3yTb4b4b4: Tffa657IntTb4b4b4, Te6edf3zoomTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3URL? Tb4b4b4{
Tff7b72val Te6edf3subdomains Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3subdomain Tff7b72= Te6edf3subdomainsTff7b72[Tb4b4b4(Te6edf3x Tff7b72+ Te6edf3yTb4b4b4) Tff7b72% Te6edf3subdomainsTb4b4b4.Te6edf3sizeTff7b72]
Tff7b72val Te6edf3formattedUrl Tff7b72=
Te6edf3urlString
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{s}Ta5d6ff"Tb4b4b4, Te6edf3subdomainTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{z}Ta5d6ff"Tb4b4b4, Te6edf3zoomTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{x}Ta5d6ff"Tb4b4b4, Te6edf3xTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{y}Ta5d6ff"Tb4b4b4, Te6edf3yTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72return Tff7b72try Tb4b4b4{
Te6edf3URLTb4b4b4(Te6edf3formattedUrlTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3MalformedURLExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffMalformed URL: Tffd700$Te6edf3formattedUrlTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3currentTileProvider Tff7b72= Te6edf3newProvider
Tff7b72return Te6edf3newProvider
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffisValidTileUrlTemplateTb4b4b4(Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{z}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72&Tff7b72&
Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{x}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72&Tff7b72&
Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{y}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)

Tff7b72private Tff7b72val Te6edf3_mapLayers Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3MapLayerItemTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3mapLayersTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3MapLayerItemTff7b72>Tff7b72> Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72init Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProvidersTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Te6edf3loadPersistedMapTypeTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3loadPersistedLayersTb4b4b4(Tb4b4b4)

Te6edf3selectedWaypointIdTb4b4b4.Te6edf3valueTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3wpId Tff7b72-Tff7b72>
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3wpMap Tff7b72= Te6edf3waypointsTb4b4b4.Te6edf3first Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3wpIdTb4b4b4) Tb4b4b4}
Te6edf3wpMapTff7b72[Te6edf3wpIdTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3waypoint Tff7b72= Te6edf3packetTb4b4b4.Te6edf3waypointTff7b72!!
Tff7b72val Te6edf3latLng Tff7b72= Te6edf3LatLngTb4b4b4(Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3latitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ T79c0ff1Te6edf3e7Tb4b4b4, Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3longitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ T79c0ff1Te6edf3e7Tb4b4b4)
Te6edf3cameraPositionStateTb4b4b4.Te6edf3position Tff7b72= Te6edf3CameraPositionTb4b4b4.Te6edf3fromLatLngZoomTb4b4b4(Te6edf3latLngTb4b4b4, T79c0ff1T79c0ff5fTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffsaveCameraPositionTb4b4b4(Te6edf3cameraPositionTb4b4b4: Te6edf3CameraPositionTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setCameraTargetLatTb4b4b4(Te6edf3cameraPositionTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3latitudeTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setCameraTargetLngTb4b4b4(Te6edf3cameraPositionTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3longitudeTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setCameraZoomTb4b4b4(Te6edf3cameraPositionTb4b4b4.Te6edf3zoomTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setCameraTiltTb4b4b4(Te6edf3cameraPositionTb4b4b4.Te6edf3tiltTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setCameraBearingTb4b4b4(Te6edf3cameraPositionTb4b4b4.Te6edf3bearingTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffloadPersistedMapTypeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3savedCustomUrl Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrlTb4b4b4.Te6edf3value
Tff7b72if Tb4b4b4(Te6edf3savedCustomUrl Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
T8b949e// Check if this custom provider still exists
Tff7b72if Tb4b4b4(
Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3savedCustomUrl Tb4b4b4} Tff7b72&Tff7b72&
Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3savedCustomUrlTb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3savedCustomUrl
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72=
Te6edf3MapTypeTb4b4b4.Te6edf3NONE T8b949e// MapType.NONE to hide google basemap when using custom provider
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// The saved custom URL is no longer valid or doesn't exist, remove preference
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
T8b949e// Fallback to default Google Map type
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3savedGoogleMapTypeName Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedGoogleMapTypeTb4b4b4.Te6edf3value
Tff7b72try Tb4b4b4{
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3valueOfTb4b4b4(Te6edf3savedGoogleMapTypeName Tff7b72?: Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4.Te6edf3nameTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffInvalid saved Google Map type: Tffd700$Te6edf3savedGoogleMapTypeNameTa5d6ff" Tb4b4b4}
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL T8b949e// Fallback in case of invalid stored name
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffloadPersistedLayersTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3layersDir Tff7b72= Te6edf3FileTb4b4b4(Te6edf3applicationTb4b4b4.Te6edf3filesDirTb4b4b4, Ta5d6ff"Ta5d6ffmap_layersTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3layersDirTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3layersDirTb4b4b4.Te6edf3isDirectoryTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3persistedLayerFiles Tff7b72= Te6edf3layersDirTb4b4b4.Te6edf3listFilesTb4b4b4(Tb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3persistedLayerFiles Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3hiddenLayerUrls Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3hiddenLayerUrlsTb4b4b4.Te6edf3value
Tff7b72val Te6edf3loadedItems Tff7b72=
Te6edf3persistedLayerFilesTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3file Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3isFileTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3layerType Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3extensionTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffkmlTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffkmzTa5d6ff"Tb4b4b4,
Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3KML
Ta5d6ff"Ta5d6ffgeojsonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffjsonTa5d6ff"Tb4b4b4,
Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3GEOJSON
Tff7b72else Tff7b72-Tff7b72> Tff7b72null
Tb4b4b4}

Te6edf3layerTypeTff7b72?.Te6edf3let Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3fromFileTb4b4b4(Te6edf3fileTb4b4b4)
Te6edf3MapLayerItemTb4b4b4(
Te6edf3name Tff7b72= Te6edf3fileTb4b4b4.Te6edf3nameWithoutExtensionTb4b4b4,
Te6edf3uri Tff7b72= Te6edf3uriTb4b4b4,
Te6edf3isVisible Tff7b72= Tff7b72!Te6edf3hiddenLayerUrlsTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3layerType Tff7b72= Tffa657itTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3networkItems Tff7b72=
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3networkMapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3networkString Tff7b72-Tff7b72>
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3parts Tff7b72= Te6edf3networkStringTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff|:|Ta5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3partsTb4b4b4.Te6edf3size Tff7b72=Tff7b72= T79c0ff3Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3id Tff7b72= Te6edf3partsTff7b72[T79c0ff0Tff7b72]
Tff7b72val Te6edf3name Tff7b72= Te6edf3partsTff7b72[T79c0ff1Tff7b72]
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3partsTff7b72[T79c0ff2Tff7b72]Tb4b4b4)
Te6edf3MapLayerItemTb4b4b4(
Te6edf3id Tff7b72= Te6edf3idTb4b4b4,
Te6edf3name Tff7b72= Te6edf3nameTb4b4b4,
Te6edf3uri Tff7b72= Te6edf3uriTb4b4b4,
Te6edf3isVisible Tff7b72= Tff7b72!Te6edf3hiddenLayerUrlsTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3layerType Tff7b72= Te6edf3LayerTypeTb4b4b4.Te6edf3KMLTb4b4b4,
Te6edf3isNetwork Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tb4b4b4}

Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3loadedItems Tff7b72+ Te6edf3networkItems
Tff7b72if Tb4b4b4(Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3iTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Tffd700${Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff persisted map layers.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3iTb4b4b4(Ta5d6ff"Ta5d6ffMap layers directory does not exist. No layers loaded.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError loading persisted map layersTa5d6ff" Tb4b4b4}
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffaddMapLayerTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657String?Tb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3layerName Tff7b72= Te6edf3fileNameTff7b72?.Te6edf3substringBeforeLastTb4b4b4(Ta5d6ff'.'Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ffLayer Tffd700${Te6edf3mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3size Tff7b72+ T79c0ff1Tffd700}Ta5d6ff"

Tff7b72val Te6edf3extension Tff7b72=
Te6edf3fileNameTff7b72?.Te6edf3substringAfterLastTb4b4b4(Ta5d6ff'.'Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72?.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72?: Te6edf3applicationTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3getTypeTb4b4b4(Te6edf3uriTb4b4b4)Tff7b72?.Te6edf3splitTb4b4b4(Ta5d6ff'/'Tb4b4b4)Tff7b72?.Te6edf3lastTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3kmlExtensions Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffkmlTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffkmzTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvnd.google-earth.kml+xmlTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvnd.google-earth.kmzTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3geoJsonExtensions Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffgeojsonTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffjsonTa5d6ff"Tb4b4b4)

Tff7b72val Te6edf3layerType Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3extensionTb4b4b4) Tb4b4b4{
Tff7b72in Te6edf3kmlExtensions Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3KML
Tff7b72in Te6edf3geoJsonExtensions Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3GEOJSON
Tff7b72else Tff7b72-Tff7b72> Tff7b72null
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3layerType Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported map layer file type: Tffd700$Te6edf3extensionTa5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Tff7b72val Te6edf3finalFileName Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3fileName Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Ta5d6ff"Tffd700$Te6edf3layerNameTa5d6ff.Tffd700$Te6edf3extensionTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Ta5d6ff"Ta5d6fflayer_Tffd700${Te6edf3UuidTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff.Tffd700$Te6edf3extensionTa5d6ff"
Tb4b4b4}

Tff7b72val Te6edf3localFileUri Tff7b72= Te6edf3copyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3finalFileNameTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3localFileUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3newItem Tff7b72= Te6edf3MapLayerItemTb4b4b4(Te6edf3name Tff7b72= Te6edf3layerNameTb4b4b4, Te6edf3uri Tff7b72= Te6edf3localFileUriTb4b4b4, Te6edf3layerType Tff7b72= Te6edf3layerTypeTb4b4b4)
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72+ Te6edf3newItem
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffFailed to copy file to internal storage.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffaddNetworkMapLayerTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3urlTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name or URL for network layer.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3urlTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3uriTb4b4b4.Te6edf3scheme Tff7b72!Tff7b72= Ta5d6ff"Ta5d6ffhttpTa5d6ff" Tff7b72&Tff7b72& Te6edf3uriTb4b4b4.Te6edf3scheme Tff7b72!Tff7b72= Ta5d6ff"Ta5d6ffhttpsTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffURL must be http or https.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Tff7b72val Te6edf3path Tff7b72= Te6edf3uriTb4b4b4.Te6edf3pathTff7b72?.Te6edf3lowercaseTb4b4b4(Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ff"
Tff7b72val Te6edf3layerType Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3pathTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"Ta5d6ff.geojsonTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72| Te6edf3pathTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"Ta5d6ff.jsonTa5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3GEOJSON
Tff7b72else Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3KML T8b949e// Default to KML
Tb4b4b4}

Tff7b72val Te6edf3newItem Tff7b72= Te6edf3MapLayerItemTb4b4b4(Te6edf3name Tff7b72= Te6edf3nameTb4b4b4, Te6edf3uri Tff7b72= Te6edf3uriTb4b4b4, Te6edf3layerType Tff7b72= Te6edf3layerTypeTb4b4b4, Te6edf3isNetwork Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72+ Te6edf3newItem

Tff7b72val Te6edf3networkLayerString Tff7b72= Ta5d6ff"Tffd700${Te6edf3newItemTb4b4b4.Te6edf3idTffd700}Ta5d6ff|:|Tffd700${Te6edf3newItemTb4b4b4.Te6edf3nameTffd700}Ta5d6ff|:|Tffd700${Te6edf3newItemTb4b4b4.Te6edf3uriTffd700}Ta5d6ff"
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setNetworkMapLayersTb4b4b4(Te6edf3googleMapsPrefsTb4b4b4.Te6edf3networkMapLayersTb4b4b4.Te6edf3value Tff7b72+ Te6edf3networkLayerStringTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid URL.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffcopyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3Uri? Tff7b72= Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3inputStream Tff7b72= Te6edf3applicationTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3openInputStreamTb4b4b4(Te6edf3uriTb4b4b4)
Tff7b72val Te6edf3directory Tff7b72= Te6edf3FileTb4b4b4(Te6edf3applicationTb4b4b4.Te6edf3filesDirTb4b4b4, Ta5d6ff"Ta5d6ffmap_layersTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3directoryTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3directoryTb4b4b4.Te6edf3mkdirsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3outputFile Tff7b72= Te6edf3FileTb4b4b4(Te6edf3directoryTb4b4b4, Te6edf3fileNameTb4b4b4)
Tff7b72val Te6edf3outputStream Tff7b72= Te6edf3FileOutputStreamTb4b4b4(Te6edf3outputFileTb4b4b4)

Te6edf3inputStreamTff7b72?.Te6edf3use Tb4b4b4{ Te6edf3input Tff7b72-Tff7b72> Te6edf3outputStreamTb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3output Tff7b72-Tff7b72> Te6edf3inputTb4b4b4.Te6edf3copyToTb4b4b4(Te6edf3outputTb4b4b4) Tb4b4b4} Tb4b4b4}
Te6edf3UriTb4b4b4.Te6edf3fromFileTb4b4b4(Te6edf3outputFileTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IOExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError copying file to internal storageTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8fftoggleLayerVisibilityTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3toggledLayerTb4b4b4: Te6edf3MapLayerItem? Tff7b72= Tff7b72null
Tff7b72val Te6edf3updatedLayers Tff7b72=
Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3map Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerIdTb4b4b4) Tb4b4b4{
Te6edf3toggledLayer Tff7b72= Tffa657itTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3isVisible Tff7b72= Tff7b72!Tffa657itTb4b4b4.Te6edf3isVisibleTb4b4b4)
Te6edf3toggledLayer
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657it
Tb4b4b4}
Tb4b4b4}
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3updatedLayers

Te6edf3toggledLayerTff7b72?.Te6edf3let Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3isVisibleTb4b4b4) Tb4b4b4{
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setHiddenLayerUrlsTb4b4b4(Te6edf3googleMapsPrefsTb4b4b4.Te6edf3hiddenLayerUrlsTb4b4b4.Te6edf3value Tff7b72- Tffa657itTb4b4b4.Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setHiddenLayerUrlsTb4b4b4(Te6edf3googleMapsPrefsTb4b4b4.Te6edf3hiddenLayerUrlsTb4b4b4.Te6edf3value Tff7b72+ Tffa657itTb4b4b4.Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffremoveMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3layerToRemove Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerId Tb4b4b4}
Te6edf3layerToRemoveTff7b72?.Te6edf3uriTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3uri Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3layerToRemoveTb4b4b4.Te6edf3isNetworkTb4b4b4) Tb4b4b4{
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setNetworkMapLayersTb4b4b4(
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3networkMapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3filterNot Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Tffd700$Te6edf3layerIdTa5d6ff|:|Ta5d6ff"Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3deleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4)
Tb4b4b4}
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setHiddenLayerUrlsTb4b4b4(Te6edf3googleMapsPrefsTb4b4b4.Te6edf3hiddenLayerUrlsTb4b4b4.Te6edf3value Tff7b72- Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3filterNot Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerId Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffrefreshMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3_mapLayersTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3layers Tff7b72-Tff7b72> Te6edf3layersTb4b4b4.Te6edf3map Tb4b4b4{ Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerIdTb4b4b4) Tffa657itTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3isRefreshing Tff7b72= Tff7b72trueTb4b4b4) Tff7b72else Tffa657it Tb4b4b4} Tb4b4b4}
T8b949e// By resetting the layer data in the UI (implied by just refreshing),
T8b949e// we trigger a reload in the Composable.
Te6edf3_mapLayersTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3layers Tff7b72-Tff7b72> Te6edf3layersTb4b4b4.Te6edf3map Tb4b4b4{ Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerIdTb4b4b4) Tffa657itTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3isRefreshing Tff7b72= Tff7b72falseTb4b4b4) Tff7b72else Tffa657it Tb4b4b4} Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffrefreshAllVisibleNetworkLayersTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNetwork Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3isVisible Tb4b4b4}Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3refreshMapLayerTb4b4b4(Tffa657itTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffdeleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4) Tb4b4b4{
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3file Tff7b72= Te6edf3uriTb4b4b4.Te6edf3toFileTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fileTb4b4b4.Te6edf3deleteTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError deleting file from internal storageTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffRecycleTa5d6ff"Tb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8ffgetInputStreamFromUriTb4b4b4(Te6edf3layerItemTb4b4b4: Te6edf3MapLayerItemTb4b4b4)Tb4b4b4: Te6edf3InputStream? Tb4b4b4{
Tff7b72val Te6edf3uriToLoad Tff7b72= Te6edf3layerItemTb4b4b4.Te6edf3uri Tff7b72?: Tff7b72return Tff7b72null
Tff7b72return Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3layerItemTb4b4b4.Te6edf3isNetwork Tff7b72&Tff7b72& Tb4b4b4(Te6edf3uriToLoadTb4b4b4.Te6edf3scheme Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffhttpTa5d6ff" Tff7b72|Tff7b72| Te6edf3uriToLoadTb4b4b4.Te6edf3scheme Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffhttpsTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3response Tff7b72= Te6edf3httpClientTb4b4b4.Te6edf3getTb4b4b4(Te6edf3uriToLoadTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3responseTb4b4b4.Te6edf3statusTb4b4b4.Te6edf3isSuccessTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3e Tb4b4b4{ Ta5d6ff"Ta5d6ffHTTP Tffd700${Te6edf3responseTb4b4b4.Te6edf3statusTffd700}Ta5d6ff fetching layer: Tffd700$Te6edf3uriToLoadTa5d6ff" Tb4b4b4}
Tff7b72returnTf0883e@withContext Tff7b72null
Tb4b4b4}
Te6edf3responseTb4b4b4.Te6edf3bodyAsChannelTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toInputStreamTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3applicationTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3openInputStreamTb4b4b4(Te6edf3uriToLoadTb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError opening InputStream from URI: Tffd700$Te6edf3uriToLoadTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffonClearedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onClearedTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3currentTileProvider Tff7b72as? Te6edf3MBTilesProviderTb4b4b4)Tff7b72?.Te6edf3closeTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffgetUserTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72=
Te6edf3nodeRepositoryTb4b4b4.Te6edf3getUserTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)
Tb4b4b4}

Tff7b72enum Tff7b72class T56d364LayerType Tb4b4b4{
Te6edf3KMLTb4b4b4,
Te6edf3GEOJSONTb4b4b4,
Tb4b4b4}

Tff7b72data Tff7b72class T56d364MapLayerItemTb4b4b4(
Tff7b72val Te6edf3idTb4b4b4: Tffa657String Tff7b72= Te6edf3UuidTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72val Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3uriTb4b4b4: Te6edf3Uri? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3isVisibleTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72trueTb4b4b4,
Tff7b72val Te6edf3layerTypeTb4b4b4: Te6edf3LayerTypeTb4b4b4,
Tff7b72val Te6edf3isNetworkTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3isRefreshingTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)

Served by rngit 1.5.0 - Generated in 0.17s